/*****************************************************************************/
/*                                                                           */
/*    Domino Operation System Driver Module                                  */
/*                                                                           */
/*    Copyright (C) 2005 Laszlo Arvai                                        */
/*                                                                           */
/*    ------------------------------------------------------------------     */
/*    drvSystemTimer - System Timer (1ms)  Driver                            */
/*****************************************************************************/

///////////////////////////////////////////////////////////////////////////////
// Includes
#define USE_OR_MASKS
#include <xc.h>
#include <krnlTypes.h>
#include <plib/timers.h>
#include <krnlSystemTimer.h>
#include "drvIOConfig.h"

///////////////////////////////////////////////////////////////////////////////
// Constants
#define TIMER_VALUE (65535-sysCPU_CLOCK_FREQUENCY/krnlSYSTEM_TIMER_TICKS_PER_SECOND)

///////////////////////////////////////////////////////////////////////////////
// Module global varables
static volatile dosWord l_system_timer = 0;

///////////////////////////////////////////////////////////////////////////////
// Init system timer
void krnlInitSystemTimer(void)
{
	OpenTimer0(TIMER_INT_ON | T0_16BIT | T0_SOURCE_INT | T0_PS_1_1);
	WriteTimer0(TIMER_VALUE);
}

///////////////////////////////////////////////////////////////////////////////
// Get system timer
dosWord krnlGetSystemTimer(void)
{
  return l_system_timer;
}

///////////////////////////////////////////////////////////////////////////////
// Interrupt handler function
void knrlSystemTimerInterruptHandler(void)
{
	INTCONbits.TMR0IF = 0;
	WriteTimer0(TIMER_VALUE);
	l_system_timer++;
}